<script>

let iterator = null;

function* helloWorldGenerator() {
    //此处的result值不是yield返回的，yield并不返回值
	//resut这个值是下次调用next()方法里面带的参数的，比如  next("value"), 则此处的resut值就是 "value"
    let result = yield asyncFun1();
    console.log(result);
}


function asyncFun1(){
	setTimeout(()=>{
		iterator.next("resule_100")
	}, 5000);
}


iterator = helloWorldGenerator();
iterator.next();

// =============以上是生成器，async await同步执行的本质原理============

// =============以下是上面的语法糖，本质是还是运用到上述的迭代器同步执行============
// async 关键字相当于生成器函数声明的 *  表明函数体内部，需要单步执行
// await 关键字相当于生成器函数体中的 yield, 即单步执行异步操作。 await只能在async函数中存在，就像yield只能在迭代器函数中存在一样
// await 后面跟的是一个Promise对象，如果不是，则JavaScript解释器自动封装成一个Promise
// 即 return Promise.resolve("result result"); 我们说的，立即成功回调

function asyncFunctioin1(){
	let p1 = new Promise((resolve, reject)=>{
		setTimeout(()=>resolve("success_1"),1000);
	});
	return p1;
}
function asyncFunctioin2(){
	let p2 = new Promise((resolve, reject)=>{
		setTimeout(()=>resolve("success_2"),2000);
	});
	return p2;
}

function asyncFunctioinSuccessRightNow(){
	/*let p = new Promise((resolve, reject)=>{
		resolve("success right now.")
	});
	return p;*/
	
	//下面相当于以上的代码
	return "success right now.";
}

async function getFunction(){
	let result1 = await asyncFunctioin1();
	let successRightNow = await asyncFunctioinSuccessRightNow();
	let result2 = await asyncFunctioin2();
	console.log(result1);
	console.log(successRightNow);
	console.log(result2);
	
	//会封装成一个执行异常的Promise对象并返回
	//throw new Error('出错了');
	
	//返回会封装成一个执行成功的Promise对象
	return "getFunction final result!!"
}

//async函数返回的是一个Promise对象，只有当函数体里面的所有异步操作都执行完毕
//Promise将执行相应的结果
let syncCallPromise = getFunction();
syncCallPromise.then(v=>console.log("getFunction call success.-->" + v)).catch(e=>console.log(e));

// =============虽然用了 async await 让代码看起来像是同步执行的，=============
// =============但是本质上所有的执行还是异步的，这点是无法改变，是JavaScript的基因============
console.log("这个打印和下面的语句不会阻塞，会立即执行")
console.log("aaaa")

</script>
